package com.itheima.advance.reflect.demo03;

import java.lang.reflect.Field;

/**
 * 演示：通过反射的方法去获取成员变量并使用；  使用就是给对象的成员变量赋值
 */
public class ReflectDemo02 {

    public static void main(String[] args) throws Exception {

        // 1. 获取Student字节码文件对象
        Class studentClazz = Class.forName("com.itheima.advance.reflect.demo03.Student");

        // 2. 获取name成员变量对象，对其进行赋值操作
        Field nameField = studentClazz.getDeclaredField("name");

        // 3. public void set​(Object obj, Object value)
        /**
         * 第一个参数表示的就是指定的对象
         * 第二个参数表示的就是实际值
         *
         * 要调用Field中的set方法，我们就需要去创建Student的对象，创建Student的对象应该存在如下几种方式：
         * 1. 直接new
         * 2. 通过返回进行创建(获取构造器对象，然后调用方法进行创建)
         * 3. 直接调用Class对象的：public T newInstance​()    ---> 该类中需要存在一个无参构造方法并且是public修饰
         */

        // 1. 直接new
        // Student s1 = new Student() ;

        // 2. 通过返回进行创建(获取构造器对象，然后调用方法进行创建)
        // Constructor con = studentClazz.getDeclaredConstructor();
        // Student s1 = (Student)con.newInstance() ;

        // 3. 接调用Class对象的：public T newInstance​()    ---> 该类中需要存在一个无参构造方法并且是public修饰
        Student s1 = (Student)studentClazz.newInstance();
        nameField.set(s1 , "张三");           // 给s1这个对象的name属性赋值为"张三"
        s1.show();

        System.out.println("-----------------------------------------------------");

        // 获取age属性对其进行赋值
        Field ageField = studentClazz.getDeclaredField("age");
        ageField.setAccessible(true);
        ageField.set(s1 , 23);              // 给s1这个对象的age属性赋值为23
        s1.show();

    }

}
